package model.proxy
{
	import model.AnneeEtude;
	import model.AnneeUniversitaire;
	import model.Formation;
	import model.Matiere;
	import model.Semestre;
	import model.Ue;
	
	import mx.collections.ArrayCollection;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.remoting.mxml.RemoteObject;
	
	import org.puremvc.as3.interfaces.IProxy;
	import org.puremvc.as3.patterns.proxy.Proxy;
	
	public class SemestreProxy extends Proxy implements IProxy
	{
		public static const NAME : String = 'SemestreProxy';
		public static const LISTE_ANNEES_UNIVERSITAIRE_SEMESTRE_OBTENUE : String = "ListeAnneesUniversitaireSemestreObtenue";
		public static const LISTE_ANNEES_ETUDE_SEMESTRE_OBTENUE : String = "ListeAnneesEtudeSemestreObtenue";
		public static const LISTE_SEMESTRES_OBTENUE : String = "listeSemestresObtenue";
		public static const LISTE_MATIERES_OBTENUE : String = "listeMatieresObtenue";
		public static const LISTE_MATIERES_ASS_OBTENUE : String = "listeMatieresAssObtenue";
		private var remoteObjectSemestre : RemoteObject = null;
		private var remoteObjectAnneeUniversitaire : RemoteObject = null;
		private var remoteObjectAnneeEtude : RemoteObject = null;
		private var remoteObjectMatiere : RemoteObject = null;
		private var remoteObjectMatiereAss : RemoteObject = null;
		
		/** 
		 * Constructor 
		 * We create the table logins and insert a login by default to test 
		 */
		public function SemestreProxy()
		{
			super(NAME, data);
			
			remoteObjectSemestre = new RemoteObject();
			remoteObjectSemestre.destination = "RemoteServiceSemestre";
			remoteObjectSemestre.source = "RemoteServiceSemestre";
			remoteObjectSemestre.endpoint = ApplicationFacade.SERVEUR;
			
			remoteObjectAnneeUniversitaire = new RemoteObject();
			remoteObjectAnneeUniversitaire.destination = "RemoteServiceAnneeUniversitaire";
			remoteObjectAnneeUniversitaire.source = "RemoteServiceAnneeUniversitaire";
			remoteObjectAnneeUniversitaire.endpoint = ApplicationFacade.SERVEUR;
			
			remoteObjectAnneeEtude = new RemoteObject;
			remoteObjectAnneeEtude.destination = "RemoteServiceAnneeEtude";
			remoteObjectAnneeEtude.source = "RemoteServiceAnneeEtude";
			remoteObjectAnneeEtude.endpoint = ApplicationFacade.SERVEUR;	
			
			remoteObjectMatiere = new RemoteObject;	
			remoteObjectMatiere.destination = "RemoteServiceMatiere";
			remoteObjectMatiere.source = "RemoteServiceMatiere";
			remoteObjectMatiere.endpoint = ApplicationFacade.SERVEUR;
			
			remoteObjectMatiereAss = new RemoteObject;	
			remoteObjectMatiereAss.destination = "RemoteServiceMatiere";
			remoteObjectMatiereAss.source = "RemoteServiceMatiere";
			remoteObjectMatiereAss.endpoint = ApplicationFacade.SERVEUR;	
		}
		
		/** 
		 * Notifications
		 */
 		public function ObtenirListeAnneeUniversitaire() : void 
 		{
 			remoteObjectAnneeUniversitaire.addEventListener(ResultEvent.RESULT, ListeAnneesUniversitaireSemestreObtenue);
			remoteObjectAnneeUniversitaire.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectAnneeUniversitaire.obtenirListeAnneesUniversitaire();
 		}
 		public function ObtenirListeAnneesEtudeSemestre(anneeUniversitaire:AnneeUniversitaire, formation:Formation) : void
 		{
 			remoteObjectAnneeEtude.addEventListener(ResultEvent.RESULT, ListeAnneesEtudeSemestreObtenue);
 			remoteObjectAnneeEtude.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectAnneeEtude.obtenirListeAnneesEtude(anneeUniversitaire, formation);
 		}
 		public function ObtenirListeSemestres(anneeEtude:AnneeEtude) : void
 		{
 			remoteObjectSemestre.addEventListener(ResultEvent.RESULT, listeSemestresObtenue);
 			remoteObjectSemestre.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectSemestre.obtenirListeSemestres(anneeEtude);
 		}
 		public function validerSemestre(semestre:Semestre, ue:Ue, listeMatieresAss:ArrayCollection) : void
 		{
 			remoteObjectSemestre.addEventListener(ResultEvent.RESULT, listeSemestresObtenue);
 			remoteObjectSemestre.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectSemestre.validerSemestre(semestre, ue, listeMatieresAss);
 		}
 		public function modifierSemestre(semestre:Semestre, ue:Ue, listeMatieresAss:ArrayCollection) : void
 		{
 			remoteObjectSemestre.addEventListener(ResultEvent.RESULT, listeSemestresObtenue);
 			remoteObjectSemestre.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectSemestre.modifierSemestre(semestre, ue, listeMatieresAss);
 		}
 		public function obtenirListeMatieres(anneeEtude:AnneeEtude) : void
 		{
 			remoteObjectMatiere.addEventListener(ResultEvent.RESULT, listeMatieresObtenue);
 			remoteObjectMatiere.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectMatiere.obtenirListeMatieresOrph(anneeEtude);
 		}
 		public function obtenirListeMatieresAss(ue:Ue) : void
 		{
 			remoteObjectMatiereAss.addEventListener(ResultEvent.RESULT, listeMatieresAssObtenue);
 			remoteObjectMatiereAss.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectMatiereAss.obtenirListeMatieresUe(ue);
 		}
 		public function supprimerUeSemestre(semestre:Semestre, ue:Ue) : void
 		{
 			remoteObjectSemestre.addEventListener(ResultEvent.RESULT, listeSemestresObtenue);
 			remoteObjectSemestre.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectSemestre.supprimerUeSemestre(semestre, ue);
 		}
 		public function ajouterMatiere(anneeEtude:AnneeEtude, matiere:Matiere) : void
 		{
 			remoteObjectMatiere.addEventListener(ResultEvent.RESULT, listeMatieresObtenue);
 			remoteObjectMatiere.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectMatiere.ajouterMatiere(anneeEtude, matiere);
 		}
 		public function modifierMatiere(anneeEtude:AnneeEtude, matiere:Matiere) : void
 		{
 			remoteObjectMatiere.addEventListener(ResultEvent.RESULT, listeMatieresObtenue);
 			remoteObjectMatiere.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectMatiere.modifierMatiere(anneeEtude, matiere);
 		}
 		public function modifierMatiereAss(ue:Ue, matiere:Matiere) : void
 		{
 			remoteObjectMatiere.addEventListener(ResultEvent.RESULT, listeMatieresAssObtenue);
 			remoteObjectMatiere.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectMatiere.modifierMatiereUe(ue, matiere);
 		}
 		public function supprimerMatiere(anneeEtude:AnneeEtude, matiere:Matiere) : void
 		{
 			remoteObjectMatiere.addEventListener(ResultEvent.RESULT, listeMatieresObtenue);
 			remoteObjectMatiere.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectMatiere.supprimerMatiere(anneeEtude, matiere);
 		}
 		public function supprimerMatiereAss(ue:Ue, matiere:Matiere) : void
 		{
 			remoteObjectMatiere.addEventListener(ResultEvent.RESULT, listeMatieresAssObtenue);
 			remoteObjectMatiere.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectMatiere.supprimerMatiereUe(ue, matiere);
 		}
 		public function dragAndDropUe(semestre1:Semestre, semestre2:Semestre, ue:Ue) : void
 		{
 			remoteObjectSemestre.addEventListener(ResultEvent.RESULT, listeSemestresObtenue);
 			remoteObjectSemestre.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectSemestre.dragAndDropUe(semestre1, semestre2, ue);
 		}
 		
 		/** 
		 * Obtenue
		 */
		private function ListeAnneesUniversitaireSemestreObtenue(event:ResultEvent):void
		{
			remoteObjectAnneeUniversitaire.removeEventListener(ResultEvent.RESULT, ListeAnneesUniversitaireSemestreObtenue);
			var listeAnneesUniversitaireSemestre:Array = (event.result as Array)
			sendNotification(LISTE_ANNEES_UNIVERSITAIRE_SEMESTRE_OBTENUE, listeAnneesUniversitaireSemestre);
		}
		private function ListeAnneesEtudeSemestreObtenue(event:ResultEvent):void
		{
			remoteObjectAnneeEtude.removeEventListener(ResultEvent.RESULT, ListeAnneesEtudeSemestreObtenue);
			var ListeAnneesEtude:Array = (event.result as Array);
			sendNotification(LISTE_ANNEES_ETUDE_SEMESTRE_OBTENUE, ListeAnneesEtude);
		}
		private function listeSemestresObtenue(event:ResultEvent):void
		{
			remoteObjectSemestre.removeEventListener(ResultEvent.RESULT, listeSemestresObtenue);
			var ListeSemestres:Array = (event.result as Array);
			sendNotification(LISTE_SEMESTRES_OBTENUE, ListeSemestres);
		}
		private function listeMatieresObtenue(event:ResultEvent):void
		{
			remoteObjectMatiere.removeEventListener(ResultEvent.RESULT, listeMatieresObtenue);
			var ListeMatieres:Array = (event.result as Array);
			sendNotification(LISTE_MATIERES_OBTENUE, ListeMatieres);
		}
		private function listeMatieresAssObtenue(event:ResultEvent):void
		{
			remoteObjectMatiereAss.removeEventListener(ResultEvent.RESULT, listeMatieresAssObtenue);
			var ListeMatieresAss:Array = (event.result as Array);
			sendNotification(LISTE_MATIERES_ASS_OBTENUE, ListeMatieresAss);
		}
				
		private function onFault(event:FaultEvent):void
		{
			trace("Fault");			
		}
	}
}